const dotenv = require('dotenv').config()

// 导入所需模块
const express = require('express')
const morgan = require('morgan')
const cors = require('cors')

// 导入自定义错误处理中间件
const { notFound, errorHandler } = require('./middleware/errorHandler')

// 导入数据库连接
const sequelize = require('./dbConnection')

// 导入模型
const User = require('./models/User')
const Article = require('./models/Article')
const Tag = require('./models/Tag')
const Comment = require('./models/Comments')

// 导入路由
const userRoute = require('./routes/users')
const articleRoute = require('./routes/articles')
const commentRoute = require('./routes/comments')
const tagRoute = require('./routes/tags')
const profileRoute = require('./routes/profile')
const favouriteRoute = require('./routes/favourites')

// 创建 Express 应用
const app = express()

// CORS 配置
app.use(cors({ credentials: true, origin: true }))

// 定义模型关系
// 用户和文章之间的一对多关系
User.hasMany(Article, {
  onDelete: 'CASCADE'
})
Article.belongsTo(User)

// 文章和标签之间的多对多关系
Article.belongsToMany(Tag, { through: 'TagList', uniqueKey: false, timestamps: false })
Tag.belongsToMany(Article, { through: 'TagList', uniqueKey: false, timestamps: false })

// 文章和评论之间的一对多关系
Article.hasMany(Comment, { onDelete: 'CASCADE' })
Comment.belongsTo(Article)

// 用户和评论之间的一对多关系
User.hasMany(Comment, { onDelete: 'CASCADE' })
Comment.belongsTo(User)

// 用户和用户之间的多对多关系（关注关系）
User.belongsToMany(User, {
  through: 'Followers',
  as: 'followers',
  timestamps: false,
})

// 用户和文章之间的多对多关系（收藏关系）
User.belongsToMany(Article, { through: 'Favourites', timestamps: false })
Article.belongsToMany(User, { through: 'Favourites', timestamps: false })

// 用于解析 JSON 请求体的中间件
app.use(express.json())

// 用于记录 HTTP 请求的中间件
app.use(morgan('tiny'))

// 默认路由
app.get('/', (req, res) => {
  res.json({ status: 'API is running' })
})

// 用户处理路由
app.use('/api', userRoute)

// 文章路由
app.use('/api/articles', articleRoute)

// 评论路由
app.use('/api/articles', commentRoute)

// 标签路由
app.use('/api/tags', tagRoute)

// 用户资料路由
app.use('/api/profiles', profileRoute)

// 收藏路由
app.use('/api/articles', favouriteRoute)

// 处理未找到路由的中间件
app.use(notFound)

// 错误处理中间件
app.use(errorHandler)

// 同步模型与数据库并创建初始数据
const sync = async () => await sequelize.sync({ force: true })
sync().then(() => {
  // 创建示例用户
  User.create({
    email: 'test@test.com',
    password: '123456',
    username: 'neo',
  })
  User.create({
    email: 'test2@test.com',
    password: '123456',
    username: 'celeb_neo',
  })
})

// 设置服务器端口
const PORT = process.env.PORT || 3000

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:3000`)
})